// Godot WebGL iframe通信桥接器
// 用于在Godot WebGL应用和父窗口之间建立通信通道

/**
 * Godot WebGL通信桥接器类
 * 负责处理Godot与父窗口之间的消息传递
 */
class GodotWebGLBridge {
  /**
   * 构造函数
   */
  constructor() {
    this.isConnected = false;
    this.messageHandlers = new Map();

    // 初始化通信接口
    this.initCommunication();
  }

  /**
   * 初始化通信系统
   */
  initCommunication() {
    console.log("Godot WebGL通信接口初始化");

    // 关键：注册Godot调用的回调函数
    window.godotMessageCallback = (message) => {
      console.log("从Godot接收消息:", message);
      this.handleGodotMessage(message);

      // 转发消息给父窗口
      if (window.parent && window.parent !== window) {
        try {
          window.parent.postMessage(
            {
              type: "godot_message",
              payload: message,
            },
            "*"
          );
        } catch (e) {
          console.error("转发消息到父窗口失败:", e);
        }
      }
    };

    // Godot准备好后的回调
    window.godotReadyCallback = () => {
      console.log("Godot应用已准备就绪");
      this.isConnected = true;

      // 通知父窗口Godot已准备好
      if (window.parent && window.parent !== window) {
        window.parent.postMessage(
          {
            type: "godot_ready",
          },
          "*"
        );
      }
    };

    // 监听来自父窗口的消息
    window.addEventListener("message", (event) => {
      if (event.data && event.data.type === "frontend_message") {
        console.log("从前端接收消息，转发给Godot:", event.data.payload);
        this.sendMessageToGodot(event.data.payload);
      }
    });
  }

  /**
   * 处理从Godot接收的消息
   * @param {string} messageStr - Godot发送的消息字符串
   */
  handleGodotMessage(messageStr) {
    try {
      let message;
      //判断是否是字符串，不是则直接赋值给message
      if (typeof messageStr !== "string") {
        message = messageStr;
      } else {
        message = JSON.parse(messageStr);
      }
      //   console.log("处理Godot消息:", message);

      // 这里可以根据需要处理特定类型的消息
      if (message.type === "scene_loaded") {
        console.log("场景已加载:", message.data.scene);
      }
    } catch (e) {
      console.error("解析Godot消息失败:", e);
    }
  }

  /**
   * 发送消息到Godot
   * @param {object} message - 要发送的消息对象
   * @returns {boolean} - 发送是否成功
   */
  sendMessageToGodot(message) {
    if (!this.isConnected) {
      console.warn("Godot尚未连接，无法发送消息");
      return false;
    }

    try {
      const messageStr = JSON.stringify(message);
      console.log("window.godotReceiveMessage:", window.godotReceiveMessage);
      // 调用Godot中的接收消息函数
      if (typeof window.godotReceiveMessage === "function") {
        window.godotReceiveMessage(messageStr);
        return true;
      } else {
        console.error("Godot接收消息函数未定义");
        return false;
      }
    } catch (e) {
      console.error("发送消息到Godot失败:", e);
      return false;
    }
  }

  /**
   * 清理通信资源
   */
  cleanup() {
    console.log("Godot WebGL通信接口清理");

    // 清理回调函数
    if (window.godotMessageCallback) {
      window.godotMessageCallback = null;
    }

    if (window.godotReadyCallback) {
      window.godotReadyCallback = null;
    }

    // 清空消息处理器
    this.messageHandlers.clear();
    this.isConnected = false;
  }
}

// 自动初始化桥接器
window.addEventListener("load", () => {
  // 创建全局实例，方便调试
  window.godotBridge = new GodotWebGLBridge();
  console.log("Godot WebGL通信桥接器已创建");
});

// 页面卸载时清理
window.addEventListener("beforeunload", () => {
  if (window.godotBridge) {
    window.godotBridge.cleanup();
  }
  console.log("Godot WebGL通信接口已清理");
});

// 导出类，以便在需要时手动创建实例
try {
  // 支持ES6模块导出
  if (typeof module !== "undefined" && module.exports) {
    module.exports = GodotWebGLBridge;
  }
  // 支持浏览器模块导入
  if (typeof window !== "undefined") {
    window.GodotWebGLBridge = GodotWebGLBridge;
  }
} catch (e) {
  console.warn("导出模块时出错:", e);
}
